<?php
操作系统相关的编程

I/O: 缓冲区 提高I/O效率，处理零碎I/O

PHP对文件操作没有缓冲区，对文件操作要注意性能问题

如何提高文件I/O效率：
    尽可能少使用I/O函数, 使用变量临时缓冲

路径信息获取
{
    DIRECTORY_SEPARATOR   跨平台路径分隔符
        __DIR__.DIRECTORY_SEPARATOR."file.php"

    basename        获取路径中的文件名，可以去除后缀名
    dirname         返回文件所属目录路径
    pathinfo        *返回文件路径信息
    realpath        返回规范化的绝对路径
    fnmatch         使用shell统配符匹配字符串
}

文件操作
{
    fopen           *打开文件流
    fread           *对文件流进行读取
    fscanf          对文件流格式化读取
    fgetc           对文件流读取一个字符
    fgets           对文件流读取一行字符串
    fgetss          对文件流读取一行并且过滤HTML标记
    fgetcsv         对文件流读取一行解析csv字段
    fwrite          *将字符串写入文件流(别名: fputs)
    fprintf         将字符串格式化写入文件流
    fputcsv         将行格式化为csv写入文件流
    fseek           *将文件指针偏移
    ftell           报告当前文件指针所在位置
    rewind          将文件指针移动到开头
    feof            判断文件流是否到文件结尾
    fflush          刷新文件流缓冲区
    flock           对文件流进行锁定，同时上锁才能保护数据
    fpassthru       将文件指针位置处剩余所有数据写入输出缓冲区
    ftruncate       截断文件到指定长度
    fclose          *关闭文件流
}

文件信息
{
    fstat       返回已打开文件的信息
    stat        *返回文件的信息
    lstat       返回软链接的信息
    fileatime   返回文件最后访问时间戳
    filemtime   返回文件最后修改时间戳
    filectime   返回文件最后inode修改时间戳
    fileinode   返回文件inode号
    filegroup   返回文件所属用户组ID
    fileowner   返回文件所属用户ID
    fileperms   返回文件的权限，八进制表示法
    filesize    返回文件大小
    filetype    返回文件类型
        fifo    管道
        char    字符设备
        dir     目录
        block   块设备
        link    软链接
        file    普通文件
        unknown 未识别文件(socket)
}

文件判断
{
    file_exists     *判断文件是否存在(目录)
    is_dir          *判断是否目录
    is_file         判断是否普通文件
    is_link         判断是否为软链接
    is_readable     判断文件是否可读
    is_writeable    判断文件是否可写
    is_executable   判断文件是否有可执行权限
    is_uploaded_file 判断文件是否通过HTTP POST上传
}

直接文件读写操作
{
    readfile            读取文件并且写入输出缓冲
    file                读取文件到数组中
    file_put_contents   *写入文件
    file_get_contents   *读取文件内容
}

disk_free_space         返回目录可用空间
disk_total_space        返回目录所在磁盘总空间
copy                    复制文件
rename                  *剪切文件
tmpfile                 *返回临时文件流句柄

----------------------------------------------------------

对普通文件操作：
    创建            touch               (fopen/touch/umask/file_exists)
    删除            rm                  (unlink)
    编辑            vim                 (fread/fwrite/fseek...)
    重命名          mv                  (rename)
    获取属性        ls                  (stat/fstat)
    属性修改        chown/chmod/touch   (chown/chmod/touch)

对软链接操作:
    创建            ln -s               (symlink)
    删除            rm                  (unlink)
    读取            readlink            (readlink)
    重命名          mv                  (rename)
    获取属性        ls                  (lstat)
    属性修改        chmod/chown/touch   (lchown/lchgrp/chmod/touch)

对目录操作:
    创建            mkdir               (mkdir/umask/file_exists)
        获取路径    pwd                 (getcwd)
        切换路径    cd                  (chdir)
    删除            rmdir               (rmdir)
    重命名          mv                  (rename)
    获取属性        ls                  (stat)
    修改属性        chmod/chown/touch   (chown/chown/touch)
    遍历目录        ls                  (opendir/readdir/closedir/rewinddir/glob/DirectoryIterator)


操作二进制文件：
    pack        按照一定格式将数据转成二进制字符串
    unpack      按照一定格式将二进制字符串转化原有数据

===============================================================================
作业：
    1. 实现grep -n "root" /etc/passwd --color功能

    2. 从A文件读一个数字，到B文件取出对应数字的单词
        单词分隔符[^a-zA-Z]

    3. 复制目录(cp -r功能)

    4. 统计目录大小

    5. 实现电子词典

    6. 实现ls -l功能(stat)
            类型/权限/用户名/组名/时间日期/软链接/特权位、粘贴位/颜色/大小单位/目录遍历/对齐问题

    生成PHP的vim帮助文档
        file_get_contents/file_put_contents/preg_match

        使用正则表达式从官方文档截取内容按一定格式写入新文件
        生成的新文件内容中必须有顶行关键词, 否则会报can't find tag...错误
        生成的新文件名必须和原文件名一样
        生成的新文件最后必须加VIM模式行(vim:filetype=help:)
        链接：
            截取链接文件与链接文本追加到tags文件中
                链接文本\t链接文件\t/^链接文本

            对tags进行vim排序重写
                system("vim +%sort +wq tags");

        测试：
            进入vim的php文档路径
                cd ~/.vim/bundle/vim-misc

            备份原有php文档
                mv doc doc.bak

            创建新php文档目录
                mkdir doc

            将生成文档文件及tags放到vim php文档目录
                cp 生成文件 tags ~/.vim/bundle/vim-misc/doc/

            重新打开vim编辑新php文档
                例：生成文件名为function.strstr.html
                    输入strstr 再按shift+k弹出查看效果

                ctrl + ]        跳进关键词链接
                ctrl + t        回到上一次跳转位置
                查找链接文件 :ta 关键词


vim:ft=php:
